include("hermite_interpolation.jl")
include("polytesting.jl")
include("trigonometric_polynomials.jl")
include("trigtesting.jl")
include("utilities.jl")
include("functiontesting.jl")
importall WGPolyTesting, WGTrigTesting, WGTrigonometricPoly, WGUtilities, WGFunTesting
using Plotly
Uwaga! Ze względu na rozmiar notatników jupytera i nałożony limit rozmiaru pliku wysyłanego w portalu Przedmioty, zostały umieszczone pojedyncze wykorzystania funkcji testujących - zachęcam do wykorzystania zakomentowanego kodu oraz zmiany parametrów takich jak N1, r (przedział interpolacji zależnie od testu) czy rodzaju węzłów (bez argumentu mamy węzły równoodległe, można wykorzystać też argument "chebyshev" pokazany w paru testach dający węzły Czebyszewa).
Wielomiany wejściowe w testach są tworzone losowo, a ich stopień jest liczbą z przedziału $ 2N_1 \leq deg(w) \leq 3N_1 $. Wielomian interpolacyjny Hermite'a przebiega w $N_1$ węzłach oraz ich pierwszych pochodnych, natomiast klasyczny wielomian interpolacyjny przebiega przez $2N_1$ równoodległych węzłów.
N1 = 4
r = 1
domain = linspace(BigFloat(-r),BigFloat(r),5000)
possible_coefficients = linspace(BigFloat(-4),BigFloat(4),100)
testcase = generate_polynomial_for_hermite(linspace(BigFloat(-r),BigFloat(r),N1), linspace(BigFloat(-r),BigFloat(r),2*N1), (2N1):1:(3N1), possible_coefficients)
polynomial = testcase[1]
hermite = get_hermite_NewtonPoly(testcase[2]...)
newton = get_NewtonPoly(testcase[3]...)
0
#Plotly.plot([Plotly.scatter(x=domain, y=[horner(polynomial, x)[1] for x in domain], name="Wielomian wejściowy"),
# Plotly.scatter(x=domain, y=[newtonPolyval(hermite, x) for x in domain ], name="Interpolacja Hermite'a"),
# Plotly.scatter(x=domain, y=[newtonPolyval(newton, x) for x in domain ], name="Interpolacja Newtona")])
Czyli wielomiany H oraz N mają stopień $2N_1 - 1$.
Poniżej, będziemy analogicznie sprawdzać 100 losowych wielomianów, a na wykresie przedstawimy średnią arytmetyczną błędów wszystkich utworzonych wielomianów dla danego argumentu
domain = linspace(BigFloat(-1),BigFloat(1), 100)
N1 = 10
t = run_polytest(N1)
Plotly.plot([Plotly.scatter(x=domain, y=t[1], name="Hermite Error"), Plotly.scatter(x=domain, y=t[2], name="Newton Error")])
t = run_polytest(20, "chebyshev")
Plotly.plot([Plotly.scatter(x=domain, y=t[1], name="Hermite Error"), Plotly.scatter(x=domain, y=t[2], name="Newton Error")])
Teraz będziemy testować funkcje postaci $f(x) = \sum_{n=0}^{m} a_n\cos(nx) + b_n\sin(nx)$ analogicznie do zwykłych wielomianów.
N1 = 5
domain = linspace(BigFloat(-1),BigFloat(1),5000)
testcase = generate_trigpoly_for_hermite(linspace(BigFloat(-1),BigFloat(1),N1), linspace(BigFloat(-1),BigFloat(1),2*N1), 5:1:15,linspace(BigFloat(-5),BigFloat(5),100))
trig_poly = testcase[1]
hermite = get_hermite_NewtonPoly(testcase[2]...)
newton = get_NewtonPoly(testcase[3]...)
0
#Plotly.plot([Plotly.scatter(x=domain, y=[value(trig_poly, x) for x in domain], name="Funkcja wejściowa"),
# Plotly.scatter(x=domain, y=[newtonPolyval(hermite, x) for x in domain ],name="Interpolacja Hermite'a"),
# Plotly.scatter(x=domain, y=[newtonPolyval(newton, x) for x in domain ], name="Interpolacja Newtona")])
W wypadku wielomianów trygonometrycznych będziemy patrzeć na błąd bezwzględny, bowiem wykres błędu względnego "wybucha" właśnie w zerach funkcji $f$ i staje się nieczytelny.
t = run_trigtest(6)
Plotly.plot([Plotly.scatter(x=domain, y=t[1], name="Hermite Error"), Plotly.scatter(x=domain, y=t[2], name="Newton Error")])
t = run_trigtest(10, "chebyshev")
Plotly.plot([Plotly.scatter(x=domain, y=t[1], name="Hermite Error"), Plotly.scatter(x=domain, y=t[2], name="Newton Error")])
Będziemy testować następującą funkcję - $f(x) = \frac{1}{1 + 25x^2} $. Sprawdzimy, czy tak jak przewidywaliśmy przy testach wielomianów, efekt Rungego nadal występuje
f(x) = 1./(1.+25.*x.^2)
df(x) = -(50.*x)./(25.*x.^2 .+ 1).^2
ddf(x) = (50.*(75.*x.^2 .- 1))./(25.*x.^2 .+ 1).^3
domain = linspace(BigFloat(-1),BigFloat(1), 2000)
N1 = 10
level = 3
_,hermite,newton = test_function(f,df,ddf, linspace(BigFloat(-1),BigFloat(1), N1), linspace(BigFloat(-1),BigFloat(1), level*N1), level)
Plotly.plot([Plotly.scatter(x=domain, y=f.(domain), name="Funkcja Rungego"),
Plotly.scatter(x=domain, y=[newtonPolyval(hermite, x) for x in domain ],name="Interpolacja Hermite'a"),
Plotly.scatter(x=domain, y=[newtonPolyval(newton, x) for x in domain ], name="Interpolacja Newtona")])
# hermite_errors = []
# newton_errors = []
# for x in domain
# exact_value = f(x)
# push!(hermite_errors, abs(exact_value - newtonPolyval(hermite, x))/abs(exact_value))
# push!(newton_errors ,abs(exact_value - newtonPolyval(newton, x))/abs(exact_value))
# end
# Plotly.plot([Plotly.scatter(x=domain, y=hermite_errors, name="Błędy interpolacji Hermite'a"),
# Plotly.scatter(x=domain, y=newton_errors, name="Błędy interpolacji Newtona")])
f(x) = e.^(x.^2)
df(x) = 2.*x.*e.^(x.^2)
ddf(x) = 2*e.^(x.^2).*(2x.^2 .+ 1)
r = 2
domain = linspace(BigFloat(-r),BigFloat(r), 2000)
N1 = 4
level = 3
_,hermite,newton = test_function(f,df,ddf, linspace(BigFloat(-r),BigFloat(r), N1), linspace(BigFloat(-r),BigFloat(r), level*N1), level)
Plotly.plot([Plotly.scatter(x=domain, y=f.(domain), name="Funkcja wejściowa"),
Plotly.scatter(x=domain, y=[newtonPolyval(hermite, x) for x in domain ],name="Interpolacja Hermite'a"),
Plotly.scatter(x=domain, y=[newtonPolyval(newton, x) for x in domain ], name="Interpolacja Newtona")])
#hermite_errors = []
#newton_errors = []
#for x in domain
# exact_value = f(x)
# push!(hermite_errors, abs(exact_value - newtonPolyval(hermite, x))/abs(exact_value))
# push!(newton_errors ,abs(exact_value - newtonPolyval(newton, x))/abs(exact_value))
#end
#Plotly.plot([Plotly.scatter(x=domain, y=hermite_errors, name="Błędy interpolacji Hermite'a"),
# Plotly.scatter(x=domain, y=newton_errors, name="Błędy interpolacji Newtona")])
f(x) = e.^(-x.^2)
df(x) = -2.*x.*e.^(-x.^2)
ddf(x) = 2*e.^(-x.^2).*(2x.^2 .- 1)
N1 = 5
level = 2
domain = linspace(BigFloat(-2),BigFloat(2), 1000)
_,hermite,newton = test_function(f,df,ddf, linspace(BigFloat(-2),BigFloat(2), N1), linspace(BigFloat(-2),BigFloat(2), level*N1), level)
Plotly.plot([Plotly.scatter(x=domain, y=f.(domain), name="Funkcja wejściowa"),
Plotly.scatter(x=domain, y=[newtonPolyval(hermite, x) for x in domain ],name="Interpolacja Hermite'a"),
Plotly.scatter(x=domain, y=[newtonPolyval(newton, x) for x in domain ], name="Interpolacja Newtona")])
#hermite_errors = []
#newton_errors = []
#for x in domain
# exact_value = f(x)
# push!(hermite_errors, abs(exact_value - newtonPolyval(hermite, x))/abs(exact_value))
# push!(newton_errors ,abs(exact_value - newtonPolyval(newton, x))/abs(exact_value))
#end
#Plotly.plot([Plotly.scatter(x=domain, y=hermite_errors, name="Błędy interpolacji Hermite'a"),
# Plotly.scatter(x=domain, y=newton_errors, name="Błędy interpolacji Newtona")])